package demo1;

class Shape {
    public void draw() {
        System.out.println("Drawing a shape");
    }
}
class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}
class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}
class Flower extends Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Flower");
    }
}
public class Polymorphism_application {
    //现在要求写一个方法按顺序打印：圆，矩形，花，圆，矩形
    public static void printShapes1() {
        Rectangle rectangle = new Rectangle();
        Circle circle = new Circle();
        Flower flower = new Flower();
        Shape[] shapes = {circle, rectangle, flower, circle, rectangle};
        for (Shape shape : shapes) {
            shape.draw(); //一个引用，调用一个方法
            //结果不同的原因：引用的对象不一样
        }
    }
    //这就是多态
    //引用的对象不一样，调用同一个重写方法，表现的行为不一样
    //借此也能更好地理解动态绑定：在运行时，程序会根据对象的实际类型来决定调用哪个方法，而不是在编译时确定

    //如果不使用多态：
    public static void printShapes2() {
        Rectangle rectangle = new Rectangle();
        Circle circle = new Circle();
        Flower flower = new Flower();
        String[] shapes = {"rectangle", "circle", "flower", "rectangle", "circle"};
        for(String s : shapes) {
            if(s.equals("rectangle")) {
                rectangle.draw();
            } else if (s.equals("circle")){
                circle.draw();
            } else {
                flower.draw();
            }
        }
   }
    public static void main(String[] args) {
        printShapes1();
        System.out.println("======================");
        printShapes2();
    }
}


//总结多态的好处:
//1. 降低圈复杂度，避免使用大量的if-else语句
//2. 可扩展能力强
//缺点：运行效率低。属性没有多态性，构造方法没有多态性。


//尽量避免在构造方法中调用重写的方法
